﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WindowsGame1
{
    class Camera
    {
        public float akto = 0;
        public int aktwx = 0, aktwy = 0, aktwz = 0;           // wspolrzedne w swiecie
        public float obx = 10, oby = 10, obz = 15;              // pozycja gracza
        public float kato = (float)3.14, katov = 0;             // kat patrzenia gracza
        public int przesx = 3, przesy = 1, przesz = 3;
        
        public void patrzX(float f)
        {
            kato = (float)(kato + f);
        }

        public void patrzY(float f)
        {
            katov = (float)(katov + f);
            if (katov > 1.8) katov = (float)1.8;
            if (katov < -1.8) katov = (float)-1.8;
        }

        public void moveForward()
        {
            obz = obz + przesz * (float)Math.Cos(kato);
            obx = obx + przesz * (float)Math.Sin(kato);

            wspCheck();
        }

        public void moveBackward()
        {
            obz = obz - przesz * (float)Math.Cos(kato);
            obx = obx - przesz * (float)Math.Sin(kato);

            wspCheck();
        }

        public void moveLeft()
        {
            obx = obx + przesx * (float)Math.Cos(kato);
            obz = obz - przesx * (float)Math.Sin(kato);

            wspCheck();
        }

        public void moveRight()
        {
            obx = obx - przesx * (float)Math.Cos(kato);
            obz = obz + przesx * (float)Math.Sin(kato);

            wspCheck();
        }

        public void moveUp()
        {
            oby += przesy;
        }

        public void moveDown()
        {
            oby -= przesy;
        }

        public void wspCheck()
        {
            if (obx < 0)
            { obx += Tile.width * World.scale; aktwx--; }
            if (obx > Tile.width * World.scale)
            { obx -= Tile.width * World.scale; aktwx++; }
            if (obz < 0)
            { obz += Tile.height * World.scale; aktwz--; }
            if (obz > Tile.height * World.scale)
            { obz -= Tile.height * World.scale; aktwz++; }
        }

        public Vector3 getEye()
        {
            return new Vector3(obx - aktwx, oby + aktwy, obz + aktwz);
        }

        public Vector3 getTarget()
        {
            return new Vector3(obx + (float)Math.Sin(kato) * 35 - aktwx, oby + (float)Math.Sin(katov) * 20 + aktwy, obz + (float)Math.Cos(kato) * 35 + aktwz);
        }

        public Vector3 getUp()
        {
            return new Vector3(0, 1, 0);
        }

        public Matrix view()
        {
            return Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Game1.device.Viewport.AspectRatio, 1.0f, 9000.0f);
        }

    }
}
